<?php
namespace Sfsn\Core\Http;

/**
 * : session类
 * 
 * @author : shooke
 *        
 *         project_name
 */
class Session
{

    /*
     * session配置
     */
    public static $config = []
    // 'expire' => 1200, //有效期
    // 'path' => '/', //有效路径
    // 'domain' => '',
    // 'secure' => false,
    // 'httponly' => false
    ;

    /**
     * 对象实例化时用于初始化配置
     * 
     * @param array $config            
     */
    public function __construct($config = [])
    {
        self::config($config);
    }

    /*
     * 配置session
     */
    public static function config($config)
    {
        self::$config = array_merge(self::$config, $config);
        ini_set('session.auto_start', 0);
        isset(self::$config['name']) && session_name(self::$config['name']);
        isset(self::$config['path']) && session_save_path(self::$config['path']);
        isset(self::$config['domain']) && ini_set('session.cookie_domain', self::$config['domain']);
        isset(self::$config['expire']) && ini_set('session.gc_maxlifetime', self::$config['expire']);
        isset(self::$config['use_trans_sid']) && ini_set('session.use_trans_sid', self::$config['use_trans_sid'] ? 1 : 0);
        isset(self::$config['use_cookies']) && ini_set('session.use_cookies', self::$config['use_cookies'] ? 1 : 0);
        isset(self::$config['cache_limiter']) && session_cache_limiter(self::$config['cache_limiter']);
        isset(self::$config['cache_expire']) && session_cache_expire(self::$config['cache_expire']);
        // // 启动session
        // if (Config::get('SESSION_AUTO_START'))
        // session_start();
    }

    /*
     * 设置session_id
     */
    public static function id($id = null)
    {
        if (is_null($id)) {
            self::start();
            return session_id();
        } else {
            session_id($id);
            self::start();
        }
    }

    /*
     * 设置session_name
     */
    public static function name($name = null)
    {
        if (is_null($name)) {
            self::start();
            return session_name();
        } else {
            session_name($name);
            self::start();
        }
    }

    /*
     * 启动session
     */
    public static function start()
    {
        // 如果没有发现$_SESSION则启动session
        ! isset($_SESSION) && session_start();
    }

    /**
     * : 获取session
     * 
     * @author : shooke
     */
    public static function get($key = null, $default = null)
    {
        self::start();
        // 定义方法中的变量
        $output = null;
        // 获取数据
        if (is_null($key)) {
            $output = empty($_SESSION) ? $default : $_SESSION;
        } else {
            $output = isset($_SESSION[$key]) ? $_SESSION[$key] : $default;
        }
        
        return $output;
    }

    /**
     * : 设置session
     * 
     * @author : shooke
     */
    public static function set($key, $value)
    {
        // 如果没有发现$_SESSION则启动session
        ! isset($_SESSION) && self::start();
        // 设置$_SESSION
        $_SESSION[$key] = $value;
    }

    public static function remove($key = null)
    {
        // 如果没有发现$_SESSION则启动session
        ! isset($_SESSION) && self::start();
        if (is_null($key)) {
            $cookie = session_get_cookie_params();
            $name = session_name();
            $expire = time() - 100;
            $path = $cookie['path'];
            $domain = $cookie['domain'];
            $secure = $cookie['secure'];
            $httponly = $cookie['httponly'];
            // 删除所有session
            setcookie($name, '', $expire, $path, $domain, $secure, $httponly); // 退出登录前执行
            $_SESSION = []; // 这会删除所有的$_SESSION数据，刷新后，有COOKIE传过来，但是没有数据。
            session_destroy(); // 这个作用更彻底，删除$_SESSION 删除session文件，和session_id
        } else {
            // 删除对应$_SESSION
            unset($_SESSION[$key]);
        }
    }
}

